package br.com.mftc.efitness.beans;

import java.util.List;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

import br.com.mftc.efitness.basicas.Academia;
import br.com.mftc.efitness.basicas.Cidade;
import br.com.mftc.efitness.basicas.Operador;
import br.com.mftc.efitness.basicas.PerfilDeUsuario;
import br.com.mftc.efitness.basicas.Permissao;
import br.com.mftc.efitness.basicas.UF;
import br.com.mftc.efitness.basicas.UsuarioDoSistema;
import br.com.mftc.efitness.excecoes.ExcecaoBuscaSemResultados;
import br.com.mftc.efitness.excecoes.ExcecaoCamposObrigatoriosNaoPreenchidos;
import br.com.mftc.efitness.excecoes.ExcecaoCaracteresEspeciaisNaoSaoPermitidos;
import br.com.mftc.efitness.excecoes.ExcecaoGeral;
import br.com.mftc.efitness.excecoes.ExcecaoListaDeRegistrosDesatualizada;
import br.com.mftc.efitness.excecoes.ExcecaoNegocio;
import br.com.mftc.efitness.excecoes.ExcecaoRegistroDesatualizado;
import br.com.mftc.efitness.negocio.ControladorAcademia;
import br.com.mftc.efitness.negocio.ControladorCidade;
import br.com.mftc.efitness.negocio.ControladorOperador;
import br.com.mftc.efitness.negocio.ControladorPerfilDeUsuario;
import br.com.mftc.efitness.negocio.ControladorPermissao;
import br.com.mftc.efitness.negocio.ControladorUsuarioDoSistema;

@ManagedBean(name = "fachada")
@ApplicationScoped
public class FachadaBean {
	
	private final ControladorAcademia controladorAcademia;
	private final ControladorCidade controladorCidade;
	private final ControladorOperador controladorOperador;
	private final ControladorPerfilDeUsuario controladorPerfilDeUsuario;
	private final ControladorUsuarioDoSistema controladorUsuarioDoSistema;
	private final ControladorPermissao controladorPermissao;

	public FachadaBean() {
		controladorAcademia = new ControladorAcademia();
		controladorCidade = new ControladorCidade();
		controladorOperador = new ControladorOperador();
		controladorPerfilDeUsuario = new ControladorPerfilDeUsuario();
		controladorUsuarioDoSistema = new ControladorUsuarioDoSistema();
		controladorPermissao = new ControladorPermissao();
	}
	
	// ACADEMIA
	public Academia inserirAcademia(Academia academia) throws ExcecaoCamposObrigatoriosNaoPreenchidos, ExcecaoCaracteresEspeciaisNaoSaoPermitidos, ExcecaoNegocio, ExcecaoGeral{
		return controladorAcademia.inserir(academia);
	}
	
	public List<Academia> consultarAcademias() {
		return controladorAcademia.consultarTodos();
	}

	// CIDADE
	public Cidade consultarCidadePorId(Long identificador) throws ExcecaoNegocio {
		return controladorCidade.consultarCidadePorId(identificador);
	}
	
	public List<Cidade> consultarCidadesPorUF(UF uf) throws ExcecaoNegocio {
		return controladorCidade.consultarPorUF(uf);
	}
	
	// OPERADOR
	public Operador inserirOperador(Operador operador) throws ExcecaoCamposObrigatoriosNaoPreenchidos, ExcecaoNegocio {
		return controladorOperador.inserir(operador);
	}
	
	// PERFIL DE USUÁRIO
	public PerfilDeUsuario inserirPerfisDeUsuario(PerfilDeUsuario perfilDeUsuario) throws ExcecaoCamposObrigatoriosNaoPreenchidos, ExcecaoCaracteresEspeciaisNaoSaoPermitidos, ExcecaoNegocio, ExcecaoGeral {
		return controladorPerfilDeUsuario.inserir(perfilDeUsuario);
	}
	
	public void alterar(PerfilDeUsuario perfilDeUsuario) throws ExcecaoCamposObrigatoriosNaoPreenchidos, ExcecaoCaracteresEspeciaisNaoSaoPermitidos, ExcecaoRegistroDesatualizado, ExcecaoNegocio, ExcecaoGeral {
		controladorPerfilDeUsuario.alterar(perfilDeUsuario);
	}
	
	public void ativarPerfilDeUsuario(PerfilDeUsuario perfilDeUsuario) throws ExcecaoRegistroDesatualizado, ExcecaoNegocio, ExcecaoGeral {
		controladorPerfilDeUsuario.ativar(perfilDeUsuario);
	}
	
	public void ativarListaDePerfisDeUsuario(List<PerfilDeUsuario> perfisDeUsuario) throws ExcecaoListaDeRegistrosDesatualizada, ExcecaoNegocio, ExcecaoGeral {
		controladorPerfilDeUsuario.ativarLista(perfisDeUsuario);
	}
	
	public void desativarPerfilDeUsuario(PerfilDeUsuario perfilDeUsuario) throws ExcecaoRegistroDesatualizado, ExcecaoNegocio, ExcecaoGeral {
		controladorPerfilDeUsuario.desativar(perfilDeUsuario);
	}
	
	public void desativarListaDePerfisDeUsuario(List<PerfilDeUsuario> perfisDeUsuario) throws ExcecaoListaDeRegistrosDesatualizada, ExcecaoNegocio, ExcecaoGeral {
		controladorPerfilDeUsuario.desativarLista(perfisDeUsuario);
	}

	public void removerPerfilDeUsuario(PerfilDeUsuario perfilDeUsuario) throws ExcecaoNegocio, ExcecaoGeral {
		controladorPerfilDeUsuario.remover(perfilDeUsuario);
	}
	
	public void removerListaDePerfisDeUsuario(List<PerfilDeUsuario> perfisDeUsuario) throws ExcecaoNegocio, ExcecaoGeral {
		controladorPerfilDeUsuario.removerLista(perfisDeUsuario);
	}
	
	public List<PerfilDeUsuario> consultarPerfisDeUsuario() throws ExcecaoNegocio, ExcecaoBuscaSemResultados {
		return controladorPerfilDeUsuario.consultarTodos();
	}
	
	public List<PerfilDeUsuario> consultarPerfisDeUsuarioPorNome(String nome) throws ExcecaoNegocio, ExcecaoBuscaSemResultados, ExcecaoCaracteresEspeciaisNaoSaoPermitidos {
		return controladorPerfilDeUsuario.consultarPorNome(nome);
	}
	
	// PERMISSÃO
	public List<Permissao> consultarPermissoes() throws ExcecaoNegocio {
		return controladorPermissao.consultarTodos();
	}

	// USUARIO DO SISTEMA
	public UsuarioDoSistema efetuarLogin(String login, String senha) throws ExcecaoCamposObrigatoriosNaoPreenchidos, ExcecaoNegocio {
		return controladorUsuarioDoSistema.efetuarLogin(login, senha);
	}
	
	public void alterarSenha(UsuarioDoSistema usuarioDoSistema, String senhaAtual, String novaSenha, String confirmeSenha) throws ExcecaoCamposObrigatoriosNaoPreenchidos, ExcecaoNegocio {
		controladorUsuarioDoSistema.alterarSenha(usuarioDoSistema, senhaAtual, novaSenha, confirmeSenha);
	}
}
